package rbac.view;

import rbac.domain.dto.RoleDto;
import rbac.domain.enums.RoleDataScope;
import rbac.domain.vo.RoleVo;
import rbac.domain.vo.Result;
import rbac.service.IRoleService;
import rbac.service.collection.RoleService;
import rbac.util.SingletonFactory;

/**
 * 角色管理界⾯
 */

public class RoleView extends BaseView<RoleVo, IRoleService> {

    private RoleView() {
        service = SingletonFactory.getInstance(RoleService.class);
    }

    public static final String MENU= """
                
                ---------------------
                       角色管理
                ---------------------
                |     0...返回上级    |
                |     1...角色列表    |
                |     2...创建角色    |
                |     3...删除角色    |
                ---------------------
                请输⼊选项：""";


    public void show() {
        String menuChoice; // ⽤于存储⽤户输⼊的选项
        do {
            System.out.print(MENU);
            menuChoice = MainView.input.nextLine();
            switch (menuChoice) {
                case "0" -> System.out.println("已返回上⼀级菜单");
                case "1" -> list();
                case "2" -> create();
                case "3" -> update();
                case "4" -> delete();
                default -> System.out.println("输⼊⾮法，请输⼊正确的菜单编号！"); }
        } while (!"0".equals(menuChoice));
    }

    public static void printError(String message) {
        System.out.println("\033[31m" + message + "\033[0m");
    }

    public void list(){
        Result result = service.list(); //调⽤服务层获取所有角色数据

        cache = (RoleVo[]) result.data; // 将获取到的角色数据存⼊缓存

        System.out.println("ID\t 角色名称\t 角色数据访问范围");
        for(RoleVo role : cache) {
            if (role != null) {
                System.out.printf("%d\t%s\t%s\n", role.id, role.name, role.dataScope);
            }
        }
    }

    public void create(){
        System.out.print(" 请输⼊角色名称：");
        String name = MainView.input.nextLine(); // 获取⽤户输⼊的角色名称

        System.out.print(" 请输⼊角色数据访问范围，输⼊的值应该为[个⼈、部⻔、全局]其中之⼀，直接按回⻋表示不修改：");
        RoleDataScope dataScope = null;
        do{
            String str = MainView.input.nextLine();

            try {
                dataScope = Enum.valueOf(RoleDataScope.class, str);
            }catch (Exception e){
                printError("输⼊的值不合法，输⼊的值应该为[个⼈、部⻔、全局]其中之⼀，直接按回⻋表示不修改，请重新输⼊:");
            }
        }while (dataScope == null);

        RoleDto dto = new RoleDto(name, dataScope);

        Result result = service.create(dto); // 调⽤服务层的创建⽅法，创建新的角色

        if (!result.success){
            printError(result.message);
            return;
        } // 如果创建操作失败，输出错误信息

        System.out.println(result.message); // 创建成功，输出成功信息

        list();
    }

    public void update(){
        RoleVo role = getCacheById();
        if (role == null){
            return;
        }

        // 提示⽤户输⼊新的角色名称
        System.out.print(" 请输⼊角色名称，直接按回⻋表示不修改：");
        String name = MainView.input.nextLine();
        // 如果⽤户没有输⼊新名称，保持原名称
        name = "".equals(name) ? role.name : name;

        System.out.print(" 请输⼊⻆⾊数据访问范围，输⼊的值应该为[个⼈、部⻔、全局]其中之⼀，直接按回⻋表示不修改：");
        RoleDataScope dataScope = null;
        do{
            String str = MainView.input.nextLine();

            if ("".equals(str)){
                dataScope = role.dataScope;
                break;
            }
            try {
                dataScope = Enum.valueOf(RoleDataScope.class, str);
            }catch (Exception e){
                printError("输⼊的值不合法，输⼊的值应该为[个⼈、部⻔、全局]其中之⼀，直接按回⻋表示不修改，请重新输⼊:");

            }
        }while (dataScope == null);

        RoleDto dto = new RoleDto(name, dataScope); // 创建新的 RoleDto对象，⽤于更新角色信息

        Result result = service.update(dto, role.id); // 调⽤服务层更新角色信息

        // 如果更新失败，显示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }

        System.out.println(result.message);

        list();
    }

    public void delete(){
        RoleVo role = getCacheById();
        if (role == null){
            return;
        }

        // 提示⽤户确认是否删除
        System.out.print("输⼊'Y'确认删除，输⼊其它取消删除：");
        String confirm = MainView.input.nextLine();

        //如果⽤户输⼊的不是'Y'或'y'，则取消删除
        if (!"Y".equalsIgnoreCase(confirm)) {
            System.out.println("您已取消删除");
            return;
        }

        // 调⽤服务层进⾏删除操作
        Result result = service.delete(role.id);

        //如果删除操作失败，提示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }

        //删除成功，输出成功信息并列出当前角色列表
        System.out.println(result.message);

        list();
    }
}

